/**
 * Created by Administrator on 2015/6/5.
 */
/* 自定义读流
* Readable读流：通过继承实现自定义的读取方式，内置read方法
* Writable写流:可以指定写入的目的地，内置write方法
* Duplex双工流:即可以读，也可以写。内置read和write方法
* Transform转换流:对数据进行转换
* PassThrough
* */

var fs=require('fs');
var util=require('util');
var stream=require('stream');
/*让自定义的readStream继承Readable方法*/
function ZfReadStream(){
    stream.Readable.call(this);
}
util.inherits(ZfReadStream,stream.Readable)
//ZfReadStream在原型上进行扩展。
ZfReadStream.prototype._read=function(){
    var content=fs.readFileSync('./2.txt');//实现读取文件
    this.push(content);//this.push是内部一个数组，也就是新定义的一个buffer对象，放到自己内部的数组中里面放的是读取到的值。
    //源码中实际的写法是：state.buffer.push(chunk);  chunk是什么？
    this.push(null);//当表示放数据已经结束了。
}
//调用读流函数
var zfReadStream=new ZfReadStream();
//调用data事件
zfReadStream.on('data',function(data){
    //读流分为两步1是读取，读取是调用_read方法进行读取的 2.是用data事件获取this.push中发射的数据
    //2.从哪读是_read方法中readFileSync方法传递的参数决定的。
    //3.ondata的时候，是把上面this.push中的内容抛出来了。
    console.log(data.toString());
}).on('end',function(){
    console.log('end');
});
/*
* Readable在原型是定义_read方法，实现功能是：没有实现，是不能直接使用readable这个方法
* 都是使用子类来实现。
* Readable读取数据时候是通过_read方法来读取的。实现这个逻辑，就可以实现自定义的读取。
* */



//要想自定义读的流只需要：“
//把数据读到this.push中，怎样去消费是在data内部处理的。


















































































